Kubenertes

您所在的位置:网站首页 nginx pending Kubenertes

Kubenertes

#Kubenertes| 来源: 网络整理| 查看: 265

1 部署应用Pod2 部署Service对象3 扩容和缩容4 删除对象

1 部署应用Pod

在Kubernetes集群上自主运行的Pod对象在非计划内终止后,其生命周期即告结束,用户需要再次手动创建类似的Pod对象才能确保其容器中的依然可得。对于Pod数量众多的场景,尤其是对微服务业务来说,用户必将疲于应付此类需求。Kubernetes的工作负载(workload)类型的控制器能够自动确保由其管控的Pod对象按用户期望的方式运行,因此,Pod的创建和管理大多会通过这种类型的控制器来进行,包括Deployment、ReplicasSet、ReplicationController等。

1)创建Deployment控制器对象

kubectl run命令可用于命令行直接创建Deployment控制器,并以 --image选项指定的镜像运行Pod中的容器,--dry-run选项可以用于命令的测试,但并不真正执行资源对象的创建过程。

# 创建一个名字叫做nginx的deployment控制器,并指定pod镜像使用nginx:1.12版本,并暴露容器内的80端口,并指定副本数量为1个,并先通过--dry-run测试命令是否错误。[root@k8s-master ~]# kubectl run nginx --image=nginx:1.12 --port=80 --replicas=1 --dry-run=true[root@k8s-master ~]# kubectl run nginx --image=nginx:1.12 --port=80 --replicas=1deployment.apps/nginx created[root@k8s-master ~]# kubectl get pods #查看所有pod对象NAME READY STATUS RESTARTS AGEnginx-685cc95cd4-9z4f4 1/1 Running 0 89s###参数说明:--image 指定需要使用到的镜像。--port 指定容器需要暴露的端口。--replicas 指定目标控制器对象要自动创建Pod对象的副本数量。

2)打印资源对象的相关信息

kubectl get 命令可用来获取各种资源对象的相关信息,它既能显示对象类型特有格式的简要信息,也能按照指定格式为YAML或JSON的详细信息,或者使用Go模板自定义要显示的属性及信息等。

[root@k8s-master ~]# kubectl get deployment #查看所有deployment控制器对象NAME READY UP-TO-DATE AVAILABLE AGEnginx 1/1 1 1 66s###字段说明:NAME 资源对象名称READY 期望由当前控制器管理的Pod对象副本数及当前已有的Pod对象副本数UP-TO-DATE 更新到最新版本定义的Pod对象的副本数量,在控制器的滚动更新模式下,表示已经完成版本更新的Pod对象的副本数量AVAILABLE 当前处于可用状态的Pod对象的副本数量,即可正常提供服务的副本数。AGE Pod的存在时长说明:Deployment资源对象通过ReplicaSet控制器实例完成对Pod对象的控制,而非直接控制。另外,通过控制器创建的Pod对象都会被自动附加一个标签。格式为“run=”。[root@k8s-master ~]# kubectl get deployment -o wide #查看deployment控制器对象的详细信息NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTORnginx 1/1 1 1 69m nginx nginx:1.12 run=nginx[root@k8s-master ~]# kubectl get pods #查看pod资源NAME READY STATUS RESTARTS AGEnginx-685cc95cd4-9z4f4 1/1 Running 0 72m[root@k8s-master ~]# kubectl get pods -o wideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESnginx-685cc95cd4-9z4f4 1/1 Running 0 73m 10.244.1.12 k8s-node1 ###字段说明:NAME pode资源对象名称READY pod中容器进程初始化完成并能够正常提供服务时即为就绪状态,此字段用于记录处于就绪状态的容器数量STATUS pod的当前状态,其值有Pending、Running、Succeeded、Failed和Unknown等其中之一RESTARTS Pod重启的次数IP pod的IP地址,通常由网络插件自动分配NODE pod被分配的节点。

3)访问Pod对象

这里部署的是pod是运行的为nginx程序,所以我们可以访问是否ok,在kubernetes集群中的任意一个节点上都可以直接访问Pod的IP地址。

[root@k8s-master ~]# kubectl get pods -o wide #查看pod详细信息NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESnginx-685cc95cd4-9z4f4 1/1 Running 0 88m 10.244.1.12 k8s-node1 [root@k8s-master ~]# curl 10.244.1.12 #kubernetes集群的master节点上访问DOCTYPE html>Welcome to nginx! body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; }Welcome to nginx!

If you see this page, the nginx web server is successfully installed andworking. Further configuration is required.

For online documentation and support please refer tonginx.org.Commercial support is available atnginx.com.

Thank you for using nginx.[root@k8s-node2 ~]# curl 10.244.1.12 #kubernetes集群的node节点上访问DOCTYPE html>Welcome to nginx! body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; }Welcome to nginx!

If you see this page, the nginx web server is successfully installed andworking. Further configuration is required.

For online documentation and support please refer tonginx.org.Commercial support is available atnginx.com.

Thank you for using nginx.

上面访问是基于一个pod的情况下,但是,当这个pod由于某种原因意外挂掉了,或者所在的节点挂掉了,那么deployment控制器会立即创建一个新的pod,这时候再去访问这个IP就访问不到了,而我们不可能每次去到节点上看到IP再进行访问。测试如下:

[root@k8s-master ~]# kubectl get pods -o wideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESnginx-685cc95cd4-9z4f4 1/1 Running 0 99m 10.244.1.12 k8s-node1 [root@k8s-master ~]# kubectl delete pods nginx-685cc95cd4-9z4f4 #删除上面的podpod "nginx-685cc95cd4-9z4f4" deleted[root@k8s-master ~]# kubectl get pods -o wide #可以看出,当上面pod刚删除,接着deployment控制器又马上创建了一个新的pod,且这次分配在k8s-node2节点上了。NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESnginx-685cc95cd4-z5z9p 1/1 Running 0 89s 10.244.2.14 k8s-node2 [root@k8s-master ~]# curl 10.244.1.12 #访问之前的pod,可以看到已经不能访问curl: (7) Failed connect to 10.244.1.12:80; 没有到主机的路由[root@k8s-master ~]# [root@k8s-master ~]# curl 10.244.2.14 #访问新的pod,可以正常访问DOCTYPE html>Welcome to nginx! body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; }Welcome to nginx!

If you see this page, the nginx web server is successfully installed andworking. Further configuration is required.

For online documentation and support please refer tonginx.org.Commercial support is available atnginx.com.

Thank you for using nginx.

2 部署Service对象

简单来说,一个Service对象可视作通过其标签选择器过滤出的一组Pod对象,并能够为此组Pod对象监听的套接字提供端口代理及调度服务。就好比上面做的测试,如果没有Service,那么每次都得去访问pod对象自己的地址等。且那还只是创建了一个pod对象,如果是多个。那么该如何是好?故使用Service解决此问题。

1)创建Service对象(将Service端口代理至Pod端口示例)

"kubectl expose"命令可用于创建Service对象以将应用程序“暴露”(expose)于网络中。

#方法一[root@k8s-master ~]# kubectl expose deployment nginx --name=nginx-svc --port=80 --target-port=80 --protocol=TCP #为deployment的nginx创建service,取名叫nginx-svc,并通过service的80端口转发至容器的80端口上。service/nginx-svc exposed#方法二[root@k8s-master ~]# kubectl expose deployment/nginx --name=nginx-svc --port=80 --target-port=80 --protocol=TCPservice/nginx-svc exposed###参数说明:--name 指定service对象的名称--port 指定service对象的端口--target-port 指定pod对象容器的端口--protocol 指定协议[root@k8s-master ~]# kubectl get svc #查看service对象。或者kubectl get serviceNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEkubernetes ClusterIP 10.96.0.1 443/TCP 25hnginx-svc ClusterIP 10.109.54.136 80/TCP 41s

这时候可以在kubernetes集群上所有节点上直接访问nginx-svc的cluster-ip及可访问到名为deployment控制器下nginx的pod。并且,集群中的别的新建的pod都可以直接访问这个IP或者这个service名称即可访问到名为deployment控制器下nginx的pod。示例:

# master节点上通过ServiceIP进行访问[root@k8s-master ~]# curl 10.109.54.136 DOCTYPE html>Welcome to nginx! body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; }Welcome to nginx!

If you see this page, the nginx web server is successfully installed andworking. Further configuration is required.

For online documentation and support please refer tonginx.org.Commercial support is available atnginx.com.

Thank you for using nginx.#新建一个客户端pod进行访问,这里这个客户端使用busybox镜像,且pod副本数量为1个,-it表示进入终端模式。--restart=Never,表示从不重启。[root@k8s-master ~]# kubectl run client --image=busybox --replicas=1 -it --restart=NeverIf you don't see a command prompt, try pressing enter./ # wget -O - -q 10.109.54.136 #访问上面创建的(service)nginx-svc的IPWelcome to nginx!....../ # / # wget -O - -q nginx-svc #访问上面创建的(service)名称nginx-svcWelcome to nginx!

2)创建Service对象(将创建的Pod对象使用“NodePort”类型的服务暴露到集群外部)

[root@k8s-master ~]# kubectl run mynginx --image=nginx:1.12 --port=80 --replicas=2 #创建一个deployments控制器并使用nginx镜像作为容器运行的应用。[root@k8s-master ~]# kubectl get pods #查看创建的podNAME READY STATUS RESTARTS AGEclient 1/1 Running 0 15hmynginx-68676f64-28fm7 1/1 Running 0 24smynginx-68676f64-9q8dj 1/1 Running 0 24snginx-685cc95cd4-z5z9p 1/1 Running 0 16h[root@k8s-master ~]# [root@k8s-master ~]# kubectl expose deployments/mynginx --type="NodePort" --port=80 --name=mynginx-svc #创建一个service对象,并将mynginx创建的pod对象使用NodePort类型暴露到集群外部。service/mynginx-svc exposed[root@k8s-master ~]# [root@k8s-master ~]# kubectl get svc #查看serviceNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEkubernetes ClusterIP 10.96.0.1 443/TCP 41hmynginx-svc NodePort 10.111.89.58 80:30884/TCP 10snginx-svc ClusterIP 10.109.54.136 80/TCP 15h###字段说明:PORT(S) 这里的mynginx-svc对象可以看出,集群中各工作节点会捕获发往本地的目标端口为30884的流量,并将其代理至当前service对象的80端口。于是集群外部的用户可以使用当前集群中任一节点的此端口来请求Service对象上的服务。[root@k8s-master ~]# [root@k8s-master ~]# netstat -nlutp |grep 30884 #查看master节点上是否有监听上面的30884端口tcp6 0 0 :::30884 :::* LISTEN 7340/kube-proxy[root@k8s-node1 ~]# [root@k8s-node1 ~]# netstat -nlutp |grep 30884 #查看node节点是否有监听上面的30884端口tcp6 0 0 :::30884 :::* LISTEN 2537/kube-proxy

客户端访问kubernetes集群的30884端口

3)Service资源对象的描述

“kuberctl describe services”命令用于打印Service对象的详细信息,它通常包括Service对象的Cluster IP,关联Pod对象使用的标签选择器及关联到的Pod资源的端点等。示例

[root@k8s-master ~]# kubectl describe service mynginx-svcName: mynginx-svcNamespace: defaultLabels: run=mynginxAnnotations: Selector: run=mynginxType: NodePortIP: 10.111.89.58Port: 80/TCPTargetPort: 80/TCPNodePort: 30884/TCPEndpoints: 10.244.1.14:80,10.244.2.15:80Session Affinity: NoneExternal Traffic Policy: ClusterEvents: ###字段说明:Selector 当前Service对象使用的标签选择器,用于选择关联的Pod对象Type 即Service的类型,其值可以是ClusterIP、NodePort和LoadBalancer等其中之一IP 当前Service对象的ClusterIPPort 暴露的端口,即当前Service用于接收并响应的端口TargetPort 容器中的用于暴露的目标端口,由Service Port路由请求至此端口NodePort 当前Service的NodePort,它是否存在有效值与Type字段中的类型相关Endpoints 后端端点,即被当前Service的Selector挑中的所有Pod的IP及其端口Session Affinity 是否启用会话粘性External Traffic Policy 外部流量的调度策略

3 扩容和缩容

所谓的“伸缩(Scaling)”就是指改变特定控制器上Pod副本数量的操作,“扩容(scaling up)”即为增加副本数量,而“缩容(scaling down)”则指缩减副本数量。不过,不论是扩容还是缩容,其数量都需要由用户明确给出。

Service对象内建的负载均衡机制可在其后端副本数量不止一个时自动进行流量分发,它还会自动监控关联到的Pod的健康状态,以确保将请求流量分发至可用的后端Pod对象。若某Deployment控制器管理包含多个Pod实例,则必要时用户还可以为其使用“滚动更新”机制将其容器镜像升级到新的版本或变更那些支持动态修改的Pod属性。

使用kubect run命令创建Deployment对象时,“--replicas=”选项能够指定由该对象创建或管理的Pod对象副本的数量,且其数量支持运行时进行修改,并立即生效。“kubectl scale”命令就是专用于变动控制器应用规模的命令,它支持对Deployment资源对象的扩容和缩容操作。

上面示例中创建的Deployment对象nginx仅创建了一个Pod对象,其所能够承载的访问请求数量即受限于这单个Pod对象的服务容量。请求流量上升到接近或超出其容量之前,可以通过kubernetes的“扩容机制”来扩招Pod的副本数量,从而提升其服务容量。

扩容示例

[root@k8s-master ~]# kubectl get pods -l run=nginx #查看标签run=nginx的podNAME READY STATUS RESTARTS AGEnginx-685cc95cd4-z5z9p 1/1 Running 0 17h[root@k8s-master ~]# [root@k8s-master ~]# kubectl scale deployments/nginx --replicas=3 #将其扩容到3个deployment.extensions/nginx scaled[root@k8s-master ~]# [root@k8s-master ~]# kubectl get pods -l run=nginx #再次查看NAME READY STATUS RESTARTS AGEnginx-685cc95cd4-f2cwb 1/1 Running 0 5snginx-685cc95cd4-pz9dk 1/1 Running 0 5snginx-685cc95cd4-z5z9p 1/1 Running 0 17h[root@k8s-master ~]# [root@k8s-master ~]# kubectl describe deployments/nginx #查看Deployment对象nginx详细信息Name: nginxNamespace: defaultCreationTimestamp: Thu, 29 Aug 2019 15:29:31 +0800Labels: run=nginxAnnotations: deployment.kubernetes.io/revision: 1Selector: run=nginxReplicas: 3 desired | 3 updated | 3 total | 3 available | 0 unavailableStrategyType: RollingUpdate...#由nginx自动创建的pod资源全部拥有同一个标签选择器“run=nginx”,因此,前面创建的Service资源对象nginx-svc的后端端点也已经通过标签选择器自动扩展到了这3个Pod对象相关的端点[root@k8s-master ~]# kubectl describe service/nginx-svcName: nginx-svcNamespace: defaultLabels: run=nginxAnnotations: Selector: run=nginxType: ClusterIPIP: 10.109.54.136Port: 80/TCPTargetPort: 80/TCPEndpoints: 10.244.1.15:80,10.244.2.14:80,10.244.2.16:80Session Affinity: NoneEvents:

缩容示例

缩容的方式和扩容相似,只不过是将Pod副本的数量调至比原来小的数字即可。例如将nginx的pod副本缩减至2个

[root@k8s-master ~]# kubectl scale deployments/nginx --replicas=2deployment.extensions/nginx scaled[root@k8s-master ~]# [root@k8s-master ~]# kubectl get pods -l run=nginxNAME READY STATUS RESTARTS AGEnginx-685cc95cd4-pz9dk 1/1 Running 0 10mnginx-685cc95cd4-z5z9p 1/1 Running 0 17h

4 删除对象

有一些不再有价值的活动对象可使用“kubectl delete”命令予以删除,需要删除Service对象nginx-svc时,即可使用下面命令完成:

[root@k8s-master ~]# kubectl get services #查看当前所有的service对象NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEkubernetes ClusterIP 10.96.0.1 443/TCP 43hmynginx-svc NodePort 10.111.89.58 80:30884/TCP 96mnginx-svc ClusterIP 10.109.54.136 80/TCP 17h[root@k8s-master ~]# kubectl delete service nginx-svc #删除service对象nginx-svc

有时候要清空某一类型下的所有对象,只需要将上面的命令对象的名称缓存“--all”选项便能实现。例如,删除默认名称空间中所有的Deployment控制器的命令如下:

[root@k8s-master ~]# kubectl delete deployment --alldeployment.extensions "mynginx" deleted

注意:受控于控制器的Pod对象在删除后会被重建,删除此类对象需要直接删除其控制器对象。不过,删除控制器时若不想删除其Pod对象,可在删除命令上使用“--cascade=false“选项。

虽然直接命令式管理的相关功能强大且适合用于操纵Kubernetes资源对象,但其明显的缺点是缺乏操作行为以及待运行对象的可信源。另外,直接命令式管理资源对象存在较大的局限性,它们在设置资源对象属性方面提供的配置能力相当有限,而且还有不少资源并不支持命令操作进行创建,例如,用户无法创建带有多个容器的Pod对象,也无法为Pod对象创建存储卷。因此,管理资源对象更有效的方式是基于保存有对象配置信息的配置清单来进行。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3